import Decimal from "decimal.js"

/**
 * 格式化金额
 * @param money { String / Number } 金额
 * @param format { String } a-b:限制输入的字符长度，a:整数长度，b:小数长度
 * @returns {string|null}
 */
export const formatMoney = (money, format) => {
  if (typeof money === 'number') {
    money = money.toString()
  }
  if (money === '-' || !money) return money
  if (!format) format = '18-2'
  const intNum = Number(format.split('-')[0])
  const decimalNum = Number(format.split('-')[1])
  const moneyArr = money.split('.')
  moneyArr[0] = moneyArr[0].length > intNum ? moneyArr[0].substr(0, intNum) : moneyArr[0]
  if (moneyArr[1]) {
    moneyArr[1] = moneyArr[1].length > decimalNum ? moneyArr[1].substr(0, decimalNum) : moneyArr[1]
  }
  money = moneyArr.join('.')
  const isNegativeNum = money.startsWith('-')
  const pointPosition = money.indexOf('.')
  const decimal = pointPosition !== -1 ? money.substr(pointPosition) : ''
  const decimal0 = new Decimal(moneyArr[0])
  const integer = decimal0.toString()
  const integerArrReverse = integer.split('').reverse().join('')
  const moneyStringify = `${isNegativeNum ? '-' : ''}${integerArrReverse.replace(/(\d{3})(?=\d)/g, '$1,').split('').reverse().join('')}${decimal}`
  return moneyStringify
}
// 此方法用来实现将一个字符串通过replace方法，格式化为普通数字格式（包括正负整数、正负浮点数都支持）
export const inputNumber = val => {
  if (!val) return val
  if (val === '.') return ''
  // 下列代码中正则表达式的非捕获组（?<=）在IE浏览器中不支持，所以弃用
  // const reg1 = /[^\d|^\-|\^.]/g // 匹配所有非数字，非-，非.的字符
  // const reg2 = /(?<=[\.|\-])[^\d]/g // 匹配所有.和-字符后的非数字字符
  // const reg3 = /(?<=\.\d*)\./g // 匹配小数后的.
  // const reg4 = /(?<=\d)\-/g // 匹配-后面的非数字
  // return val.replace(reg1, '').replace(reg2, '').replace(reg3, '').replace(reg4, '')
  /**
   *   暂时去掉负数
   *   if (val === '-' || !val) return val
   *   const reg1 = /[^\d|\-|\.]/g
   *   const reg2 = /(\d|\.)\-+/g
   */
  const reg1 = /[^\d|\.]/g
  const reg2 = /(\d|\.)/g
  const str = val.replace(reg1, '').replace(reg2, '$1')
  const pointArr = str.split('.')
  let value = ''
  if (pointArr.length > 1) {
    pointArr.forEach((item, index) => {
      value = value + item
      if (!index) {
        value = value + '.'
      }
    })
  } else {
    value = str
  }
  return value
}

// 此方法用来实现将一个字符串通过replace方法，不包括正负号 小数点  用于行号的输入
export const inputOnlyNumber = val => {

  const reg1 = /[^\d]/g
  const reg2 = /(\d)/g
  const str = val.replace(reg1, '').replace(reg2, '$1')
  const pointArr = str.split('.')
  let value = ''
  if (pointArr.length > 1) {
    pointArr.forEach((item, index) => {
      value = value + item
      if (!index) {
        value = value + '.'
      }
    })
  } else {
    value = str
  }
  return value
}

// 限制只能输入数字和字母，用于账号的输入
export const inputNumberAndLetter = val => {

  //会匹配除了数字和英文字母之外的所有字符。
  const reg1 = /[^a-zA-Z0-9]/g
  //匹配数字和英文字母
  const str = val.replace(reg1, '')
  const pointArr = str.split('.')
  let value = ''
  if (pointArr.length > 1) {
    pointArr.forEach((item, index) => {
      value = value + item
      if (!index) {
        value = value + '.'
      }
    })
  } else {
    value = str
  }
  return value
}

